
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pkg1ifxServidorTcp;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;
import pkg1ifxArchivos.cifxLogs;

/**
 *
 * @author strailaparicio
 */
public class cifxCmd extends Thread{
    
    private String scmd = "";
    private String sresultados="";
    private String sresulfile="";
    private Process oproceso=null;
    private cifxLogs olog = new cifxLogs();
    private File fdestino = null;
    private OutputStream fout = null;
    private String sdirectorio="./salidacmd/";
    private boolean bresultados=false;
    
    /**
     * Constructor de la clase comando
     * en esta constructor se pasa el comando a ser ejecutado y administrado
     * @param scomando, comando a ser ejecutado, en esta clase no se hace diferencia
     *                  del sistema operativo Windows o Unix.
     */
    public cifxCmd(String scomando)
    {
        scmd=scomando;
    }
    private void setCmd(String scomando)
    {
        scmd=scomando;
    }
    public String getCmd()
    {
        return scmd;
    }
    public String getResultados()
    {
        return sresultados;
        
    }
    public String getNomFileResult()
    {
        return sresulfile;
    }
    public boolean HayResultados()
    {
        return bresultados;
    }
    private void setOutResults() throws FileNotFoundException
    {
        int nconse=1;
        //Comprobando el directorio
        File dir = new File(sdirectorio);
        if(!dir.exists())
            dir.mkdir();
        sresulfile=sdirectorio+String.valueOf(nconse)+"ifx-"+getfecha()+"salida.txt";
        fdestino = new File(sresulfile);
        olog.outMensaje("cifxCmd.setOutResults(): Creando archivo salida ("+sresulfile+")");
        while(fdestino.exists())
        {
            nconse++;
            sresulfile=sdirectorio+String.valueOf(nconse)+"ifx-"+getfecha()+"salida.txt";
            fdestino = new File(sresulfile);
        }
        fout = new FileOutputStream(fdestino,true);
        olog.outMensaje("cifxCmd.setOutResults(): Archivo de salida asignado ("+sresulfile+")");
        
    }
    private String getfecha()
    {
        Calendar calendario = Calendar.getInstance();
        return  calendario.get(Calendar.DAY_OF_MONTH)+""+(calendario.get(Calendar.MONTH)+1)+""+
                calendario.get(Calendar.YEAR); /*+" "+
                calendario.get(Calendar.HOUR)+":" + 
                calendario.get(Calendar.MINUTE)+":"+ 
                calendario.get(Calendar.SECOND)+" ";*/
    }
    @Override
    public void run()
    {
        try {
            
            if(scmd.length()>0)
            {
                olog.outMensaje("cifxCmd.run(): Ejecutando comando ("+scmd+")");
                oproceso=Runtime.getRuntime().exec(scmd);
                
                BufferedReader brStdOut = new BufferedReader(new InputStreamReader(oproceso.getInputStream()));
                BufferedReader brStdErr = new BufferedReader(new InputStreamReader(oproceso.getErrorStream()));
                setOutResults();
                String str=null;
                olog.outMensaje("cifxCmd.run(): Recuperando resultados ("+scmd+")");
                while ((str = brStdOut.readLine())!=null)
                {
                    str+="\n";
                    if(sresultados.length()<2048)
                    {
                        sresultados+=str;
                    }
                    fout.write(str.getBytes());
                }
                fout.write(("ERRORES ===== \n").getBytes());
                while ((str = brStdErr.readLine())!=null)
                {
                    str+="\n";
                    if(sresultados.length()<2048)
                    {
                        sresultados+=str;
                    }
                    fout.write(str.getBytes());
                }
                fout.flush();
                fout.close();
                brStdOut.close();
                brStdErr.close(); 
                //fout.close();
                
                olog.outMensaje("cifxCmd.run(): Termino de ejecutar ("+scmd+")");
            }
            bresultados=true;
            
        } catch (IOException ex) {
            Logger.getLogger(cifxCmd.class.getName()).log(Level.SEVERE, null, ex);
            olog.outMensaje("cifxCmd.run(): IOException ("+ex.toString()+")");
            bresultados=true;
        }

    }
}
